package com.xy.work.template.base.domain.api;
import com.xy.work.template.common.enums.ApiStatusEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

/**
 * 通用API接口返回
 *
 * @author niuniu
 * @date 2021-08-16 10:34:57
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "通用API接口返回", description = "Common Api Response")
public class ApiResult<T> implements Serializable {

    private static final long serialVersionUID = 2441841648166000202L;

    /**
     * 通用返回状态
     */
    @ApiModelProperty(value = "通用返回状态", required = true)
    private Integer code;
    /**
     * 通用返回信息
     */
    @ApiModelProperty(value = "通用返回信息", required = true)
    private String message;
    /**
     * 通用返回数据
     */
    @ApiModelProperty(value = "通用返回数据", required = true)
    private T data;

    /**
     * 构造一个自定义的API返回(不带返回数据)
     *
     * @param code 状态码
     * @param message 返回内容
     * @return ApiResponse
     */
    public static ApiResult of(Integer code, String message) {
        return new ApiResult(code, message, null);
    }

    /**
     * 构造一个自定义的API返回
     *
     * @param code 状态码
     * @param message 返回内容
     * @param data 返回数据
     * @return ApiResponse
     */
    public static ApiResult of(Integer code, String message, Object data) {
        return new ApiResult(code, message, data);
    }





    /**
     * 构造一个有状态且带数据的API返回
     *
     * @param status 状态 {@link ApiStatusEnum}
     * @param data 返回数据
     * @return ApiResponse
     */
    public static ApiResult ofStatus(ApiStatusEnum status, Object data) {
        return of(status.getCode(), status.getMessage(), data);
    }

    /**
     * 构造一个有状态的API返回
     *
     * @param status 状态 {@link ApiStatusEnum}
     * @return ApiResponse
     */
    public static ApiResult ofStatus(ApiStatusEnum status) {
        return ofStatus(status, null);
    }

    /**
     * 构造一个成功且自定义消息的API返回
     *
     * @param message 返回内容
     * @return ApiResponse
     */
    public static ApiResult ofMessage(String message) {
        return of(ApiStatusEnum.OK.getCode(), message, null);
    }

    /**
     * 构造一个成功且带数据的API返回
     *
     * @param data 返回数据
     * @return ApiResponse
     */
    public static ApiResult ofSuccess(Object data) {
        return ofStatus(ApiStatusEnum.OK, data);
    }
}
